package com.zb.config;

import cn.dev33.satoken.listener.SaTokenListener;
import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.StpUtil;
import com.alibaba.fastjson.JSON;
import com.zb.enums.DeviceType;
import com.zb.result.Result;
import com.zb.result.ResultCode;
import com.zb.stp.StpNetworkUtil;
import com.zb.stp.StpUserUtil;
import com.zb.utils.ZbManager;
import com.zb.websocket.server.LoginWebSocketServer;
import org.springframework.stereotype.Component;

import java.util.Objects;

/**
 * @Author WEN
 * @Date 2023/7/19 0019
 **/
@Component
public class MySaTokenListener implements SaTokenListener {
    // 每次登录时触发
    @Override
    public void doLogin(String s, Object o, String s1, SaLoginModel saLoginModel) {
        ZbManager.log.info("登录 =======>>>>>>>>loginType：{}，login：{}，tokenValue：{}，saLoginModel：{}", s, o, s1, saLoginModel);
    }

    // 每次注销时触发
    @Override
    public void doLogout(String s, Object o, String s1) {
        ZbManager.log.info("注销 =======>>>>>>>>loginType：{}，login：{}，tokenValue：{}", s, o, s1);
    }

    // 每次被踢下线时触发
    @Override
    public void doKickout(String s, Object o, String s1) {
        ZbManager.log.info("被踢下线 =======>>>>>>>>loginType：{}，login：{}，tokenValue：{}", s, o, s1);
    }

    // 每次被顶下线时触发
    @Override
    public void doReplaced(String s, Object o, String s1) {
        ZbManager.log.info("被顶下线 =======>>>>>>>>loginType：{}，login：{}，tokenValue：{}", s, o, s1);
        // 是否为PC端登录
        if (Objects.equals(StpUtil.TYPE, s)) {
            // 退出旧的登录
            StpUtil.logout(o, DeviceType.PC.name());
        }
        // 客户报单移动端
        if (Objects.equals(StpUserUtil.TYPE, s)) {
            // 退出旧的登录
            StpUserUtil.logout(o, DeviceType.ORDER_MOBILE.name());
        }
        // 服务商移动端
        if (Objects.equals(StpNetworkUtil.TYPE, s)) {
            // 退出旧的登录
            StpNetworkUtil.logout(o, DeviceType.NETWORK_MOBILE.name());
        }
        String message = JSON.toJSONString(Result.error(ResultCode.COERCE_LOGIN_OUT.getCode(), ResultCode.COERCE_LOGIN_OUT.getMessage()));
        // 向客户端推送已被强制退出的消息
        LoginWebSocketServer.send(s1, message);
    }

    // 每次被封禁时触发
    @Override
    public void doDisable(String s, Object o, String s1, int i, long l) {
        ZbManager.log.info("被封禁 =======>>>>>>>>loginType：{}，login：{}，service：{}，level：{}，disableTime：{}", s, o, s1, i, l);
    }

    // 每次被解封时触发
    @Override
    public void doUntieDisable(String s, Object o, String s1) {
        ZbManager.log.info("被解封 =======>>>>>>>>loginType：{}，login：{}，service：{}", s, o, s1);
    }

    @Override
    public void doOpenSafe(String s, String s1, String s2, long l) {

    }

    @Override
    public void doCloseSafe(String s, String s1, String s2) {

    }

    @Override
    public void doCreateSession(String s) {

    }

    @Override
    public void doLogoutSession(String s) {

    }

    @Override
    public void doRenewTimeout(String s, Object o, long l) {

    }
}
